package Objetos;

import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class SQLconnection {

    private String user;
    private String password;
    private String db;
    private String host;
    private String url;
    private Connection conn = null;
    private Statement stm;
    private ResultSet rs;

    public SQLconnection() {
        this.user = "root";
        this.password = "1234";
        this.db = "mysql";
        this.host = "localhost:3306";
        this.url = "jdbc:mysql://" + this.host + "/" + this.db;
    }

    public SQLconnection(String server, String usuario, String contraseña, String bd) {
        this.user = "root";
        this.password = "1234";
        this.db = "mysql";
        this.host = "localhost:3306";
        this.url = "jdbc:mysql://" + this.host + "/" + this.db;
    }

    public void connectar() {
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            conn = DriverManager.getConnection(url, user, password);
            if (conn != null) {
                System.out.println("Conexión a base de datos " + url + " … Ok");
                stm = conn.createStatement();
            }
        } catch (SQLException ex) {
            System.out.println("Hubo un problema al intentar conectarse con la base de datos " + url);
        } catch (ClassNotFoundException ex) {
            System.out.println(ex);
        }
    }

    public String getDb() {
        return db;
    }

    public void setDb(String db) {
        this.db = db;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public ResultSet consultar(String tabla) throws SQLException {
        rs = stm.executeQuery("SELECT * FROM " + tabla);
        return rs;
    }

    public String buscarNombre(String tabla, String nombre) throws SQLException {
        String texto = "SELECT * FROM " + tabla + " WHERE nombre = '" + nombre + "' LIMIT 1";
        System.out.println(texto);
        String name = null;
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            name = rs.getString(1);
        } catch (SQLException ex) {
            System.out.println(ex);
        }
        return name;
    }

    public int buscarLogin(String tabla, String dni, String pswd) throws SQLException {
        String texto = "SELECT * FROM " + tabla + " WHERE dni = '" + dni + "' and pswd= " + pswd + " LIMIT 1";
        String name = null;
        System.out.println(texto);
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            name = rs.getString(2);
        } catch (SQLException ex) {
            System.out.println("Usuario no valido");
            return 0;

        }
        return 1;
    }

    public void insertar(String tabla, String valores) {
        try {

            String in = "INSERT INTO " + tabla + " VALUES (" + valores + ")";
            System.out.println(in);
            // String in="INSERT INTO AltaIncidencia VALUES (2,2,'2001/02/5','Descripción de la incidencia...','0.0','2001/02/5')";
            stm.execute(in);
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }

    public void actualizar(String tabla, @SuppressWarnings("UseOfObsoleteCollectionType") Hashtable usuario, String nombre) {
        try {
            stm.execute("UPDATE " + tabla + " SET nombre=’" + usuario.get("nombre") + "‘ WHERE nombre=’" + nombre + "‘");
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }
        public void actualizarOT(String tabla,String texto) {
        try {
            stm.execute("UPDATE " + tabla +" "+ texto);
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }

    public void eliminar(String tabla, String nombre) {
        try {
            stm.execute("DELETE FROM " + tabla + " WHERE nombre=’" + nombre + "‘");
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }
    /*
     * Devuelve 1 si es jefeservicio Devuelve 2 si es operario Devuelve 3 si es
     * maestro
     */

    public int buscarEspecialidad(String user, String pswd) {
        String texto = "SELECT * FROM jefeservicio , personal WHERE dni=dniJ and dni = '" + user + "' and pswd= " + pswd + " LIMIT 1";
        String name = null;
        System.out.println(texto);
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            name = rs.getString(2);
            return 1;
        } catch (SQLException ex) {
            System.out.println("No es jefeservicio");
        }
        texto = "SELECT * FROM opreario , personal WHERE dni=dniO and dni = '" + user + "' and pswd= " + pswd + " LIMIT 1";
        name = null;
        System.out.println(texto);
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            name = rs.getString(2);
            return 2;
        } catch (SQLException ex) {
            System.out.println("No es operario");
        }
        texto = "SELECT * FROM maestro , personal WHERE dni=dniM and dni = '" + user + "' and pswd= " + pswd + " LIMIT 1";
        name = null;
        System.out.println(texto);
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            name = rs.getString(2);

            return 3;
        } catch (SQLException ex) {
            System.out.println("No es maestro");
        }
        return 0;
    }

    public AltaIncidencia[] buscarAltas() {
        String contar = "SELECT count(*) FROM altaincidencia WHERE fechaRecepcion='1970/01/01'";
        String cantidad = "";
        try {
            rs = stm.executeQuery(contar);
            rs.next();
            cantidad = rs.getString(1);
            System.out.println(cantidad);
        } catch (SQLException ex) {
            System.out.println("Error");
        }
        AltaIncidencia[] arrayAI = new AltaIncidencia[Integer.parseInt(cantidad)];
        int posicion = 0;
        String texto = "SELECT * FROM altaincidencia WHERE fechaRecepcion='1970/01/01'";
        String name = null;
        System.out.println(texto);
        int codigo = 0;
        String descripcion = "";
        try {
            rs = stm.executeQuery(texto);
            while (posicion < Integer.parseInt(cantidad)) {
                rs.next();
                codigo = Integer.parseInt(rs.getString(1));
                descripcion = rs.getString(3);
                AltaIncidencia a = new AltaIncidencia(codigo, descripcion);
                arrayAI[posicion] = a;
                //arrayAI[posicion].setFechaPeticion(Calendar.rs.getString(3));
                posicion++;

            }
        } catch (SQLException ex) {
            System.out.println("No hay altas pendientes");
        }
        return arrayAI;
    }

    public AltaIncidencia buscarAlta(String id) throws ParseException {
        String texto = "SELECT * FROM altaincidencia WHERE codAlta='" + id + "' LIMIT 1";
        System.out.println(texto);
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
            //Fijamos el formato de la fecha tal cómo vendrá en la cadena
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
            String strFecha = rs.getString(2);



            //Convertimos la cafena a Date
            java.util.Date fecha = formatoDelTexto.parse(strFecha);



            //Finalmente, convertimos el Date en Calendar
            cal.setTime(fecha);
            String desc = rs.getString(3);
            AltaIncidencia ai = new AltaIncidencia(Integer.parseInt(id), cal, desc);
            //name = rs.getString(2);
            return ai;

        } catch (SQLException ex) {
            System.out.println("Alta incidencia no valida");

        }
        return null;
    }

    public String buscar(String texto) {
        System.out.println(texto);
        String dni = null;
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            dni = rs.getString(1);
        } catch (SQLException ex) {
            System.out.println(ex);
        }
        return dni;
    }

    public String buscarCategoria(int id) {
        //System.out.println();
        String texto = "Select categoria from personal where dni='" + id + "'";
        String categoria = "";
        try {
            rs = stm.executeQuery(texto);
            rs.next();
            categoria = rs.getString(1);
        } catch (SQLException ex) {
            System.out.println(ex);
        }
        return categoria;
    }

    public AltaIncidencia[] buscarAltasMaestro(int dniM) {
        String texto = "SELECT * FROM altaincidencia, incidencia WHERE dniM='" + dniM + "' and codIncidencia=codAlta";
        System.out.println(texto);
        String contar = "SELECT count(*) FROM altaincidencia,incidencia WHERE dniM='" + dniM + "' and codIncidencia=codAlta";
        String cantidad = "";
        try {
            rs = stm.executeQuery(contar);
            rs.next();
            cantidad = rs.getString(1);
            System.out.println(cantidad);
        } catch (SQLException ex) {
            System.out.println("Error");
        }
        AltaIncidencia[] arrayAI = new AltaIncidencia[Integer.parseInt(cantidad)];
        int posicion = 0;
        String name = null;
        System.out.println(texto);
        int codigo = 0;
        String descripcion = "";
        try {
            rs = stm.executeQuery(texto);
            while (posicion < Integer.parseInt(cantidad)) {
                rs.next();
                codigo = Integer.parseInt(rs.getString(1));
                descripcion = rs.getString(3);
                AltaIncidencia a = new AltaIncidencia(codigo, descripcion);
                arrayAI[posicion] = a;
                //arrayAI[posicion].setFechaPeticion(Calendar.rs.getString(3));
                posicion++;

            }
        } catch (SQLException ex) {
            System.out.println("No hay altas pendientes");
        }
        return arrayAI;

    }

    public Personal[] buscarEmpleados(String texto, String personas) {
        Personal[] ps = null;
        try {
            System.out.println(texto);
            String pers = personas;
            rs = stm.executeQuery(pers);
            rs.next();
            int cant = Integer.parseInt(rs.getString(1));
            ps = new Personal[cant];
            System.out.println("Cantidad: " + cant);
            try {
                rs = stm.executeQuery(texto);
                int contador = 0;
                while (contador < cant) {
                    rs.next();
                    String nombre = rs.getString(1);
                    String apellido = rs.getString(2);
                    String dni = rs.getString(3);
                    Personal p = new Personal();
                    p.setNombre(nombre);
                    p.setApellidos(apellido);
                    p.setDni(Integer.parseInt(dni));
                    ps[contador] = p;
                    contador++;
                }
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLconnection.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ps;
    }

    public OrdenDeTrabajo[] buscarOTOperario(String texto,String text2) {
        OrdenDeTrabajo[] ot= null;
        try {
            System.out.println(texto);
            String texto2=text2;
            rs = stm.executeQuery(texto2);
            rs.next();
            int ots= Integer.parseInt(rs.getString(1));
            ot = new OrdenDeTrabajo[ots];
            System.out.println("Cantidad: " + ots);
            try {
                rs = stm.executeQuery(texto);
                int contador = 0;
                while (contador < ots) {
                    rs.next();
                    String codigo = rs.getString(1);
                    String descripcion = rs.getString(2);
                    String desInc = rs.getString(3);
                    OrdenDeTrabajo o= new OrdenDeTrabajo();
                    o.setCodOT(Integer.parseInt(codigo));
                    o.setDescripcion(descripcion);
                    o.setDescIncidencia(desInc);
                    ot[contador] = o;
                    contador++;
                }
            } catch (SQLException ex) {
                System.out.println(ex);
            }
        } catch (SQLException ex) {
            Logger.getLogger(SQLconnection.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ot;
    }

    public AltaIncidencia[] buscarAltasMaestroC(int dniM) {
        String texto = "SELECT * FROM altaincidencia, incidencia, ordenTrabajo WHERE dniM='" + dniM + "' and fechaReparacion<>'2' and codOT=codAlta and codIncidencia=codAlta";
        System.out.println("---------"+texto);
        String contar = "SELECT count(*) FROM altaincidencia,incidencia,ordenTrabajo WHERE dniM='" + dniM + "' and fechaReparacion<>'2' and codOT=codAlta and codIncidencia=codAlta";
        String cantidad = "";
        try {
            rs = stm.executeQuery(contar);
            rs.next();
            cantidad = rs.getString(1);
            System.out.println(cantidad);
        } catch (SQLException ex) {
            int opt= JOptionPane.showOptionDialog(null,
                                "Alerta",
                                "No hay partes de trabajo sin finalizar",
                                JOptionPane.OK_OPTION,
                                JOptionPane.ERROR_MESSAGE,
                                null, new Object[]{"OK"},
                                "OK");
            if(opt==0){
            System.exit(0);}
        }
        AltaIncidencia[] arrayAI = new AltaIncidencia[Integer.parseInt(cantidad)];
        int posicion = 0;
        String name = null;
        System.out.println(texto);
        int codigo = 0;
        String descripcion = "";
        try {
            rs = stm.executeQuery(texto);
            while (posicion < Integer.parseInt(cantidad)) {
                rs.next();
                codigo = Integer.parseInt(rs.getString(1));
                descripcion = rs.getString(3);
                AltaIncidencia a = new AltaIncidencia(codigo, descripcion);
                arrayAI[posicion] = a;
                //arrayAI[posicion].setFechaPeticion(Calendar.rs.getString(3));
                posicion++;

            }
        } catch (SQLException ex) {
            System.out.println("No hay altas pendientes");
        }
        return arrayAI;

    }

    public void actualizarI(String altaIncidencia, String string) {
        
    }
}
